● Zion Boggan
repos/Docket/app/bill/[id]/page.tsx
zionboggan.com ↗
654 lines · tsx
History for this file →
1
import type { Metadata } from "next";
2
import Link from "next/link";
3
import { notFound } from "next/navigation";
4
import { Card } from "@/components/ui";
5
import { SourceLink } from "@/components/source-link";
6
import { StatusPill, classifyStatus } from "@/components/status-pill";
7
import { PartyTag } from "@/components/party-tag";
8
import { MemberAvatar } from "@/components/member-avatar";
9
import { RiderFlag, ChangeTag } from "@/components/rider-flag";
10
import { getBillDetail, type BillDiffChange, type BillAmendment } from "@/lib/feed";
11
import { formatDate, congressLabel } from "@/lib/format";
12
import { CiteThis } from "@/components/cite-this";
13
import { BillPdfViewer } from "@/components/record-archive";
14
 
15
export const revalidate = 300;
16
 
17
export function generateMetadata({
18
  params,
19
}: {
20
  params: { id: string };
21
}): Metadata {
22
  const numeric = parseInt(params.id.replace(/^bill:/, ""), 10);
23
  const bill = Number.isFinite(numeric) ? getBillDetail(numeric) : null;
24
  if (!bill) return { title: "Bill not found" };
25
  return { title: `${bill.number} - ${bill.policyArea}`, description: bill.title };
26
}
27
 
28
export default function BillPage({
29
  params,
30
}: {
31
  params: { id: string };
32
}) {
33
  const numeric = parseInt(params.id.replace(/^bill:/, ""), 10);
34
  const bill = Number.isFinite(numeric) ? getBillDetail(numeric) : null;
35
  if (!bill) notFound();
36
 
37
  const statusVariant = classifyStatus(bill.status);
38
  const riderCount = bill.diffs.filter((d) => d.riderFlag).length;
39
  const otherChanges = bill.diffs.filter((d) => !d.riderFlag);
40
 
41
  return (
42
    <div className="mx-auto w-full max-w-[860px] px-6 sm:px-8" style={{ paddingTop: "clamp(32px, 6vw, 56px)", paddingBottom: "clamp(48px, 8vw, 80px)" }}>
43
 
44
      {}
45
      <nav aria-label="Breadcrumb" style={{ marginBottom: "clamp(28px, 5vw, 44px)" }}>
46
        <ol style={{ display: "flex", flexWrap: "wrap", alignItems: "center", gap: "8px", marginBottom: "12px" }}>
47
          <li>
48
            <Link
49
              href="/"
50
              className="focus-ring label no-underline hover:underline"
51
              style={{ color: "var(--dk-signal)", fontSize: "12px", letterSpacing: "0.12em" }}
52
            >
53
              Home
54
            </Link>
55
          </li>
56
          <li aria-hidden="true" className="label" style={{ color: "var(--dk-ash-2)", fontSize: "12px" }}>
57
            /
58
          </li>
59
          <li>
60
            <Link
61
              href="/bills"
62
              className="focus-ring label no-underline hover:underline"
63
              style={{ color: "var(--dk-signal)", fontSize: "12px", letterSpacing: "0.12em" }}
64
            >
65
              Bills
66
            </Link>
67
          </li>
68
          <li aria-hidden="true" className="label" style={{ color: "var(--dk-ash-2)", fontSize: "12px" }}>
69
            /
70
          </li>
71
          <li
72
            className="label"
73
            style={{ color: "var(--dk-ash)", fontSize: "12px", letterSpacing: "0.12em" }}
74
            aria-current="page"
75
          >
76
            <span className="font-mono">{bill.number}</span>
77
          </li>
78
        </ol>
79
        <Link
80
          href="/bills"
81
          className="focus-ring no-underline hover:underline"
82
          style={{
83
            display: "inline-flex",
84
            alignItems: "center",
85
            gap: "8px",
86
            minHeight: "44px",
87
            fontFamily: "var(--font-mono), ui-monospace, monospace",
88
            fontSize: "13px",
89
            letterSpacing: "0.08em",
90
            color: "var(--dk-signal)",
91
          }}
92
        >
93
          ← Back to Bills
94
        </Link>
95
      </nav>
96
 
97
      {}
98
      <header style={{ borderBottom: "1px solid var(--dk-line)", paddingBottom: "clamp(28px, 5vw, 48px)", marginBottom: "clamp(28px, 5vw, 40px)" }}>
99
        {}
100
        <p
101
          className="label"
102
          style={{ color: "var(--dk-signal)", marginBottom: "20px", fontSize: "12px", letterSpacing: "0.14em" }}
103
        >
104
          <span className="font-mono">{bill.number}</span>
105
          {congressLabel(bill.congress) ? ` · ${congressLabel(bill.congress)}` : ""}
106
          {bill.policyArea ? ` · ${bill.policyArea}` : ""}
107
        </p>
108
 
109
        {}
110
        <h1
111
          className="font-display text-paper"
112
          style={{
113
            fontSize: "clamp(2.8rem, 9vw, 4.5rem)",
114
            fontWeight: 900,
115
            lineHeight: 1.0,
116
            letterSpacing: "-0.01em",
117
            wordSpacing: "0.06em",
118
            textTransform: "uppercase",
119
            marginBottom: "24px",
120
          }}
121
        >
122
          {bill.number}
123
        </h1>
124
 
125
        {}
126
        <p
127
          className="font-prose"
128
          style={{ fontStyle: "italic", fontSize: "clamp(1rem, 1.8vw, 1.125rem)", lineHeight: 1.55, color: "var(--dk-ash)", maxWidth: "56ch" }}
129
        >
130
          {bill.title}
131
        </p>
132
      </header>
133
 
134
      {}
135
      <section style={{ marginBottom: "clamp(24px, 4vw, 32px)" }} aria-label="Key facts">
136
        <div className="grid gap-4 sm:grid-cols-3">
137
          {}
138
          <div style={{ borderRadius: "10px", border: "1px solid var(--dk-line)", background: "var(--dk-surface)", padding: "clamp(18px, 3vw, 24px)" }}>
139
            <p className="label" style={{ color: "var(--dk-ash-2)", marginBottom: "12px", fontSize: "12px", letterSpacing: "0.12em" }}>
140
              Status
141
            </p>
142
            <StatusPill variant={statusVariant} dot>
143
              {bill.status ? "On record" : "Introduced"}
144
            </StatusPill>
145
            <p
146
              className="mt-3 font-prose"
147
              style={{ fontSize: "0.9375rem", lineHeight: 1.5, color: "var(--dk-ash)" }}
148
            >
149
              {bill.status || "No status text on file."}
150
            </p>
151
          </div>
152
 
153
          {}
154
          <div style={{ borderRadius: "10px", border: "1px solid var(--dk-line)", background: "var(--dk-surface)", padding: "clamp(18px, 3vw, 24px)" }}>
155
            <p className="label" style={{ color: "var(--dk-ash-2)", marginBottom: "12px", fontSize: "12px", letterSpacing: "0.12em" }}>
156
              Sponsor
157
            </p>
158
            {bill.sponsor ? (
159
              <div className="flex items-start gap-3">
160
                <MemberAvatar
161
                  name={bill.sponsor.name}
162
                  photoUrl={bill.sponsor.photoUrl}
163
                  size="md"
164
                />
165
                <div className="min-w-0">
166
                  <Link
167
                    href={bill.sponsor.href}
168
                    className="focus-ring font-display font-bold text-paper underline underline-offset-4 hover:text-paper"
169
                    style={{ fontSize: "1rem" }}
170
                  >
171
                    {bill.sponsor.name}
172
                  </Link>
173
                  <div className="mt-2 flex items-center gap-2">
174
                    <PartyTag party={bill.sponsor.partyCode} />
175
                    <span
176
                      className="font-mono"
177
                      style={{ fontSize: "0.8125rem", color: "var(--dk-ash)" }}
178
                    >
179
                      {bill.sponsor.state}
180
                      {bill.sponsor.district != null ? ` ${bill.sponsor.district}` : ""}
181
                    </span>
182
                  </div>
183
                </div>
184
              </div>
185
            ) : bill.sponsorDisplay ? (
186
              <p
187
                className="font-display font-bold text-paper"
188
                style={{ fontSize: "1rem" }}
189
              >
190
                {bill.sponsorDisplay}
191
              </p>
192
            ) : (
193
              <p
194
                className="font-prose italic"
195
                style={{ fontSize: "0.9375rem", color: "var(--dk-ash-2)" }}
196
              >
197
                No sponsor linked in the record.
198
              </p>
199
            )}
200
          </div>
201
 
202
          {}
203
          <div style={{ borderRadius: "10px", border: "1px solid var(--dk-line)", background: "var(--dk-surface)", padding: "clamp(18px, 3vw, 24px)" }}>
204
            <p className="label" style={{ color: "var(--dk-ash-2)", marginBottom: "12px", fontSize: "12px", letterSpacing: "0.12em" }}>
205
              Last action
206
            </p>
207
            <p
208
              className="font-prose text-paper"
209
              style={{ fontSize: "0.9375rem", lineHeight: 1.5 }}
210
            >
211
              {bill.timeline[0]?.text || "No actions on file"}
212
            </p>
213
            <p className="label mt-3" style={{ color: "var(--dk-ash-2)" }}>
214
              {bill.timeline[0]?.chamber ? `${bill.timeline[0].chamber} · ` : ""}
215
              <span className="font-mono">
216
                {bill.timeline[0] ? formatDate(bill.timeline[0].date) : "-"}
217
              </span>
218
            </p>
219
          </div>
220
        </div>
221
      </section>
222
 
223
      {}
224
      {(bill.policyArea || bill.subjects.length > 0) ? (
225
        <section style={{ marginTop: "16px" }} aria-label="Policy area">
226
          <div style={{ borderRadius: "10px", border: "1px solid var(--dk-line)", background: "var(--dk-surface)", padding: "clamp(18px, 3vw, 24px)" }}>
227
            <div className="flex flex-col gap-5 sm:flex-row sm:items-start sm:justify-between">
228
              <div className="min-w-0">
229
                <p className="label" style={{ color: "var(--dk-ash-2)", marginBottom: "8px", fontSize: "12px", letterSpacing: "0.12em" }}>
230
                  Policy area
231
                </p>
232
                {bill.policyArea ? (
233
                  <Link
234
                    href={`/bills?policyArea=${encodeURIComponent(bill.policyArea)}`}
235
                    className="focus-ring font-display font-bold text-paper underline underline-offset-4 hover:text-paper"
236
                    style={{ fontSize: "1.0625rem" }}
237
                  >
238
                    {bill.policyArea}
239
                  </Link>
240
                ) : (
241
                  <p
242
                    className="font-prose italic"
243
                    style={{ fontSize: "0.9375rem", color: "var(--dk-ash-2)" }}
244
                  >
245
                    No policy area on file.
246
                  </p>
247
                )}
248
              </div>
249
              {bill.subjects.length > 0 ? (
250
                <div className="min-w-0 sm:max-w-[60%]">
251
                  <p className="label" style={{ color: "var(--dk-ash-2)", marginBottom: "8px", fontSize: "12px", letterSpacing: "0.12em" }}>
252
                    Subjects
253
                  </p>
254
                  <ul className="flex flex-wrap gap-2">
255
                    {bill.subjects.map((s) => (
256
                      <li key={s} className="pill" style={{ color: "var(--dk-ash)" }}>
257
                        {s}
258
                      </li>
259
                    ))}
260
                  </ul>
261
                </div>
262
              ) : null}
263
            </div>
264
          </div>
265
        </section>
266
      ) : null}
267
 
268
      {}
269
      <section className="mt-12" aria-label="Summary">
270
        <SectionLabel eyebrow="Summary" title="What this bill does" />
271
        {bill.summary ? (
272
          <div className="rounded-[6px] border border-line bg-surface p-6">
273
            <p
274
              className="font-prose text-paper"
275
              style={{ fontSize: "1.0625rem", lineHeight: 1.65, whiteSpace: "pre-line" }}
276
            >
277
              {bill.summary}
278
            </p>
279
            <p className="label mt-5" style={{ color: "var(--dk-ash-2)" }}>
280
              {bill.summarySource
281
                ? `Plain-language summary: ${bill.summarySource}`
282
                : "Plain-language summary: Congressional Research Service via GovInfo"}
283
            </p>
284
          </div>
285
        ) : (
286
          <div className="rounded-[6px] border border-line bg-surface p-6">
287
            <p
288
              className="font-prose italic"
289
              style={{ fontSize: "0.9375rem", color: "var(--dk-ash)" }}
290
            >
291
              Plain-language summary not yet available - read the official text
292
              below.
293
            </p>
294
          </div>
295
        )}
296
      </section>
297
 
298
      {}
299
      <BillPdfViewer
300
        pdfUrl={bill.pdfUrl}
301
        archivePdfUrl={bill.archivePdfUrl}
302
        sourceUrl={bill.sourceUrl}
303
        billNumber={bill.number}
304
      />
305
 
306
      {}
307
      <section className="mt-12" aria-label="Version diff">
308
        <SectionLabel eyebrow="Version diff" title="What changed in the text" />
309
        <p
310
          className="prose-lead mb-6"
311
          style={{ fontSize: "1rem", color: "var(--dk-ash)" }}
312
        >
313
          Added, removed, and amended sections between versions of this bill.
314
          Sections that entered outside the bill&apos;s named subject are flagged as
315
          riders.
316
        </p>
317
        {bill.diffs.length === 0 ? (
318
          <div className="rounded-[6px] border border-line bg-surface p-6">
319
            <p
320
              className="font-prose italic"
321
              style={{ fontSize: "0.9375rem", color: "var(--dk-ash)" }}
322
            >
323
              No section-level diff on file. Some changes enter via voice vote
324
              or unanimous consent - no individual record exists for those.
325
            </p>
326
          </div>
327
        ) : (
328
          <div className="space-y-4">
329
            {riderCount > 0 ? (
330
              <div
331
                className="rounded-[6px] border-2 p-6"
332
                style={{
333
                  borderColor: "color-mix(in srgb, var(--dk-signal) 45%, transparent)",
334
                  background: "var(--dk-surface)",
335
                }}
336
              >
337
                <div className="flex items-center gap-2">
338
                  <RiderFlag />
339
                  <span
340
                    className="font-display font-bold text-paper"
341
                    style={{ fontSize: "1rem" }}
342
                  >
343
                    {riderCount} rider-flagged section
344
                    {riderCount === 1 ? "" : "s"}
345
                  </span>
346
                </div>
347
                <div className="mt-4 space-y-4">
348
                  {bill.diffs
349
                    .filter((d) => d.riderFlag)
350
                    .map((d, i) => (
351
                      <DiffEntry key={`rider-${i}`} d={d} />
352
                    ))}
353
                </div>
354
              </div>
355
            ) : null}
356
 
357
            {otherChanges.length > 0 ? (
358
              <div className="rounded-[6px] border border-line bg-surface p-6">
359
                <p className="label mb-4" style={{ color: "var(--dk-ash)" }}>
360
                  Other recorded changes
361
                </p>
362
                <div className="space-y-4">
363
                  {otherChanges.map((d, i) => (
364
                    <DiffEntry key={`chg-${i}`} d={d} />
365
                  ))}
366
                </div>
367
              </div>
368
            ) : null}
369
          </div>
370
        )}
371
      </section>
372
 
373
      {}
374
      <div className="mt-12 grid gap-8 lg:grid-cols-[1.3fr_1fr]">
375
        {}
376
        <section aria-label="Status timeline">
377
          <SectionLabel
378
            eyebrow={`Timeline · ${bill.timeline.length} action${bill.timeline.length === 1 ? "" : "s"}`}
379
            title="Actions on this bill"
380
          />
381
          {bill.timeline.length === 0 ? (
382
            <div className="rounded-[6px] border border-line bg-surface p-6">
383
              <p
384
                className="font-prose italic"
385
                style={{ fontSize: "0.9375rem", color: "var(--dk-ash-2)" }}
386
              >
387
                No actions are linked to this bill in the record.
388
              </p>
389
            </div>
390
          ) : (
391
            <div className="rounded-[6px] border border-line bg-surface p-6">
392
              <ol className="relative space-y-6 border-l border-line pl-5">
393
                {bill.timeline.map((t, i) => (
394
                  <li key={i} className="relative">
395
                    <span
396
                      aria-hidden="true"
397
                      className="absolute -left-[1.625rem] top-1 h-2.5 w-2.5 rounded-full border-2 border-line"
398
                      style={{ backgroundColor: "var(--dk-surface)" }}
399
                    />
400
                    <p
401
                      className="font-prose text-paper"
402
                      style={{ fontSize: "0.9375rem", lineHeight: 1.5 }}
403
                    >
404
                      {t.text}
405
                    </p>
406
                    <p className="label mt-1.5" style={{ color: "var(--dk-ash-2)" }}>
407
                      <span className="font-mono">{formatDate(t.date)}</span>
408
                      {t.chamber ? ` · ${t.chamber}` : ""}
409
                      {t.actionType ? ` · ${t.actionType}` : ""}
410
                    </p>
411
                    <div className="mt-2">
412
                      <SourceLink url={t.sourceUrl} />
413
                    </div>
414
                  </li>
415
                ))}
416
              </ol>
417
            </div>
418
          )}
419
        </section>
420
 
421
        <div className="space-y-8">
422
          {}
423
          <section aria-label="Roll-call votes">
424
            <SectionLabel eyebrow="Votes" title="Roll calls on this bill" />
425
            <div className="rounded-[6px] border border-line bg-surface p-6">
426
              {bill.votes.length > 0 ? (
427
                <p
428
                  className="font-display font-bold text-paper"
429
                  style={{ fontSize: "1.0625rem" }}
430
                >
431
                  {bill.votes.length} vote{bill.votes.length === 1 ? "" : "s"} recorded.
432
                </p>
433
              ) : (
434
                <p
435
                  className="font-prose italic"
436
                  style={{ fontSize: "0.9375rem", color: "var(--dk-ash-2)" }}
437
                >
438
                  No roll-call votes are linked to this bill yet. When a vote
439
                  occurs, it will appear here with a link to the full member
440
                  roster.
441
                </p>
442
              )}
443
              <p className="label mt-4" style={{ color: "var(--dk-ash-2)" }}>
444
                Browse all votes on the{" "}
445
                <Link
446
                  href="/votes"
447
                  className="focus-ring rounded-sm underline underline-offset-4 hover:text-paper"
448
                  style={{ color: "var(--dk-signal)" }}
449
                >
450
                  votes register
451
                </Link>
452
                .
453
              </p>
454
            </div>
455
          </section>
456
 
457
          {}
458
          <section aria-label="Bill text versions">
459
            <SectionLabel
460
              eyebrow={`Versions · ${bill.versions.length}`}
461
              title="Bill text versions"
462
            />
463
            {bill.versions.length === 0 ? (
464
              <div className="rounded-[6px] border border-line bg-surface p-6">
465
                <p
466
                  className="font-prose italic"
467
                  style={{ fontSize: "0.9375rem", color: "var(--dk-ash-2)" }}
468
                >
469
                  No full-text versions on file.
470
                </p>
471
              </div>
472
            ) : (
473
              <div className="rounded-[6px] border border-line bg-surface divide-y divide-line">
474
                {bill.versions.map((v) => (
475
                  <div
476
                    key={v.id}
477
                    className="flex items-center justify-between gap-3 p-4"
478
                  >
479
                    <div className="min-w-0">
480
                      <p
481
                        className="font-display font-bold text-paper"
482
                        style={{ fontSize: "0.9375rem" }}
483
                      >
484
                        {v.versionCode.toUpperCase()} · {v.versionLabel}
485
                      </p>
486
                      <p className="label mt-1" style={{ color: "var(--dk-ash-2)" }}>
487
                        <span className="font-mono">{formatDate(v.versionDate)}</span>
488
                      </p>
489
                    </div>
490
                    <SourceLink url={v.sourceUrl} label="GovInfo" />
491
                  </div>
492
                ))}
493
              </div>
494
            )}
495
          </section>
496
        </div>
497
      </div>
498
 
499
      {}
500
      <section className="mt-12" aria-label="Amendments">
501
        <SectionLabel
502
          eyebrow={`Amendments · ${bill.amendments.length}`}
503
          title="Amendments filed"
504
        />
505
        {bill.amendments.length === 0 ? (
506
          <div className="rounded-[6px] border border-line bg-surface p-6">
507
            <p
508
              className="font-prose italic"
509
              style={{ fontSize: "0.9375rem", color: "var(--dk-ash-2)" }}
510
            >
511
              No amendments are linked to this bill.
512
            </p>
513
          </div>
514
        ) : (
515
          <AmendmentsList amendments={bill.amendments} />
516
        )}
517
      </section>
518
 
519
      {}
520
      <div className="mt-12 border-t border-line pt-8">
521
        <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
522
          <div>
523
            <p className="label mb-1" style={{ color: "var(--dk-ash-2)" }}>
524
              Official record
525
            </p>
526
            <p
527
              className="font-prose"
528
              style={{ fontSize: "0.9375rem", color: "var(--dk-ash)" }}
529
            >
530
              Full text, sponsor, and all actions on Congress.gov.
531
            </p>
532
          </div>
533
          <SourceLink url={bill.sourceUrl} label="Congress.gov" />
534
        </div>
535
 
536
        {}
537
        <p className="label mt-8" style={{ color: "var(--dk-ash-2)" }}>
538
          No comment, reaction, or share surface appears on this page, by policy.
539
        </p>
540
      </div>
541
 
542
      {}
543
      <div className="mt-8">
544
        <p className="label mb-4" style={{ color: "var(--dk-ash)" }}>
545
          Cite this record
546
        </p>
547
        <CiteThis
548
          kind="bill"
549
          title={`${bill.number} - ${bill.title}`}
550
          permalink={`https://usdocket.org/bill/${params.id}`}
551
          sourceUrl={bill.sourceUrl}
552
        />
553
      </div>
554
    </div>
555
  );
556
}
557
 
558
function SectionLabel({
559
  eyebrow,
560
  title,
561
}: {
562
  eyebrow?: string;
563
  title: string;
564
}) {
565
  return (
566
    <div style={{ marginBottom: "20px" }}>
567
      {eyebrow ? (
568
        <p
569
          className="label"
570
          style={{ color: "var(--dk-signal)", marginBottom: "10px", fontSize: "12px", letterSpacing: "0.14em" }}
571
        >
572
          {eyebrow}
573
        </p>
574
      ) : null}
575
      <h2
576
        className="font-display text-paper"
577
        style={{ fontSize: "clamp(1.2rem, 3.5vw, 1.5rem)", fontWeight: 800, letterSpacing: "-0.02em", textTransform: "uppercase", lineHeight: 1.05 }}
578
      >
579
        {title}
580
      </h2>
581
    </div>
582
  );
583
}
584
 
585
function AmendmentsList({ amendments }: { amendments: BillAmendment[] }) {
586
  return (
587
    <ul className="space-y-3" role="list">
588
      {amendments.map((a) => (
589
        <li
590
          key={a.id}
591
          className="flex flex-col gap-2 rounded-[6px] border border-line bg-surface p-5 sm:flex-row sm:items-center sm:justify-between"
592
        >
593
          <div className="min-w-0">
594
            <p
595
              className="font-mono text-paper"
596
              style={{ fontSize: "0.9375rem", fontWeight: 700 }}
597
            >
598
              {a.type} {a.number}
599
            </p>
600
            {a.sponsor ? (
601
              <Link
602
                href={a.sponsor.href}
603
                className="focus-ring mt-1 label underline underline-offset-4 hover:text-paper"
604
                style={{ color: "var(--dk-signal)" }}
605
              >
606
                {a.sponsor.name}
607
              </Link>
608
            ) : null}
609
          </div>
610
          <div className="flex items-center gap-3">
611
            {a.status ? (
612
              <span className="label" style={{ color: "var(--dk-ash-2)" }}>
613
                {a.status}
614
              </span>
615
            ) : (
616
              <span className="label" style={{ color: "var(--dk-ash-2)" }}>
617
                Filed
618
              </span>
619
            )}
620
            <SourceLink url={a.sourceUrl} />
621
          </div>
622
        </li>
623
      ))}
624
    </ul>
625
  );
626
}
627
 
628
function DiffEntry({ d }: { d: BillDiffChange }) {
629
  return (
630
    <div className="border-l-2 pl-4" style={{ borderColor: "var(--dk-line)" }}>
631
      <div className="flex flex-wrap items-center gap-2">
632
        <ChangeTag change={d.change} />
633
        {d.riderFlag ? <RiderFlag /> : null}
634
        <span className="label" style={{ color: "var(--dk-ash-2)" }}>
635
          <span className="font-mono">
636
            {d.fromVersion} → {d.toVersion}
637
          </span>
638
          {d.sectionId && d.sectionId !== "_"
639
            ? ` · §${d.sectionId.slice(0, 8)}`
640
            : ""}
641
        </span>
642
      </div>
643
      <p
644
        className="mt-2 font-mono leading-relaxed text-paper"
645
        style={{ fontSize: "0.8125rem" }}
646
      >
647
        {d.snippet || "No snippet recorded."}
648
      </p>
649
      <div className="mt-2">
650
        <SourceLink url={d.sourceUrl} />
651
      </div>
652
    </div>
653
  );
654
}